home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Source Code
/
Visual Basic Source Code.iso
/
vbsource
/
texthook
/
txthook.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-07
|
4KB
|
156 lines
/************************************************************************
TXTHOOK.DLL -- Author: Jeff Simms -- CIS 72200,3173 -- September 7, 1992
Purpose - Subclass VB textbox to add 'ES_NOHIDESEL' functionality. Also
adds caret choice and overstrike mode.
Modesty prevents me from taking full credit for this code. But hopefully
this is cut and paste at its best.
***********************************************************************/
#include <windows.h>
#include "txthook.h"
int gOverwrite=0,nWidth;
HBITMAP ghBitmap=0;
HFONT hfont,tmpfont;
POINT lppt;
TEXTMETRIC tm;
HDC hdc;
FARPROC lpfnVBEditWndProc;
HWND hVBEditWnd=0,hVBFormWnd,wnd;
WORD wFlag=0,wStart,wEnd;
DWORD dwResult;
int FAR PASCAL WEP (int bSystemExit)
{
return (1);
}
VOID __export FAR PASCAL SetTextHook(HWND hVBTextWnd,HWND hvbFormWnd)
{
if (hVBEditWnd)
return;
hVBEditWnd = hVBTextWnd;
hVBFormWnd = hvbFormWnd;
GetCaretPos(&lppt);
NewFont();
lpfnVBEditWndProc = (FARPROC) SetWindowLong(hVBEditWnd,GWL_WNDPROC,
(DWORD)(FARPROC) MainFilterProc);
SetFocus(hVBEditWnd);
}
VOID __export FAR PASCAL TextOverstrike(int bSwitch)
{
gOverwrite = bSwitch;
if (GetFocus() == hVBEditWnd){
DestroyCaret();
DoTheCaretThing();
}
else
SetFocus(hVBEditWnd);
}
VOID __export FAR PASCAL CaretBitmap(HBITMAP hbitmap)
{
if (ghBitmap != hbitmap)
DeleteObject(ghBitmap);
ghBitmap = hbitmap;
if (GetFocus() == hVBEditWnd){
DestroyCaret();
DoTheCaretThing();
}
else
SetFocus(hVBEditWnd);
}
VOID FAR PASCAL DoTheCaretThing()
{
if (hfont != (HFONT) SendMessage(hVBEditWnd,WM_GETFONT,0,0L))
NewFont();
if (!gOverwrite)
nWidth = GetSystemMetrics(SM_CXBORDER)*2;
else
nWidth = tm.tmAveCharWidth;
CreateCaret(hVBEditWnd,ghBitmap,nWidth,tm.tmHeight);
if (!wFlag)
SetCaretPos(lppt.x,lppt.y);
else
wFlag = 0;
ShowCaret(hVBEditWnd);
}
VOID FAR PASCAL NewFont()
{
tmpfont = (HFONT) SendMessage(hVBFormWnd,WM_GETFONT,0,0L);
hfont = (HFONT) SendMessage(hVBEditWnd,WM_GETFONT,0,0L);
SendMessage(hVBFormWnd,WM_SETFONT,(WORD) hfont,0L);
hdc = GetDC(hVBFormWnd);
GetTextMetrics(hdc,&tm);
ReleaseDC(hVBFormWnd,hdc);
SendMessage(hVBFormWnd,WM_SETFONT,(WORD) tmpfont,0L);
}
VOID __export FAR PASCAL UndoTextHook(int zero)
{
SetWindowLong(hVBEditWnd,GWL_WNDPROC, (DWORD)(FARPROC) lpfnVBEditWndProc);
hVBEditWnd = 0;
gOverwrite = 0;
DeleteObject(ghBitmap);
ghBitmap = 0;
}
LONG __export FAR PASCAL MainFilterProc(HWND hWnd,unsigned wMsg,WORD wParam,LONG lParam)
{
switch (wMsg){
case WM_CHAR:
if (gOverwrite && (wParam != VK_BACK) && (wParam != VK_DELETE))
{
dwResult = SendMessage(hVBEditWnd,EM_GETSEL,0,0L);
wStart = LOWORD(dwResult);
wEnd = HIWORD(dwResult);
if (wEnd == wStart)
{
wEnd++;
SendMessage(hVBEditWnd,EM_SETSEL,0,MAKELONG(wStart,wEnd));
}
SendMessage(hVBEditWnd,EM_REPLACESEL,0,(DWORD)((LPSTR)&wParam ));
return (FALSE);
}
break;
case WM_LBUTTONDOWN:
wFlag = 1;
SetFocus(hVBEditWnd);
break;
case WM_SETFOCUS:
DoTheCaretThing();
break;
case WM_KILLFOCUS:
GetCaretPos(&lppt);
DestroyCaret();
return 0L;
break;
case WM_DESTROY:
DeleteObject(ghBitmap);
SetWindowLong(hVBEditWnd,GWL_WNDPROC, (DWORD)(FARPROC) lpfnVBEditWndProc);
PostMessage(hVBEditWnd,WM_DESTROY,0,0);
return 0L;
break;
}
return(CallWindowProc(lpfnVBEditWndProc,hWnd, wMsg, wParam, lParam));
}